#ifndef LCD_LL_H
#define LCD_LL_H

#include "stm32f1xx_ll_bus.h"
#include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_rcc.h"
#include "stdint.h"
#include "stdbool.h"
#include "delay_us.h"
// 引脚定义
#define LCD_RES_PORT    GPIOB
#define LCD_CS1_PORT    GPIOB
#define LCD_A0_PORT     GPIOB
#define LCD_SCL_PORT    GPIOB
#define LCD_SI_PORT     GPIOB
#define LCD_BLA_PORT    GPIOC

#define LCD_RES_PIN     LL_GPIO_PIN_4    // PB4-RES
#define LCD_CS1_PIN     LL_GPIO_PIN_5    // PB5-CS1
#define LCD_A0_PIN      LL_GPIO_PIN_6    // PB6-A0
#define LCD_SCL_PIN     LL_GPIO_PIN_7    // PB7-SCL
#define LCD_SI_PIN      LL_GPIO_PIN_8    // PB8-SI
#define LCD_BLA_PIN     LL_GPIO_PIN_14   // PC14-BL
// 8×16图片索引（新增）
typedef enum {
    PIC_0,             // 充电标志
    PIC_MAX1           // 图片数量边界
} Pic8x16Index;
// 32×16图片索引（新增）
typedef enum {
    PIC_0_PERCENT,    // 0% 进度图
    PIC_25_PERCENT,   // 25% 进度图
    PIC_50_PERCENT,   // 50% 进度图
    PIC_75_PERCENT,   // 75% 进度图
    PIC_100_PERCENT,  // 100% 进度图
    PIC_MAX           // 图片数量边界
} Pic32x16Index;
// 页面索引
typedef enum {
    PAGE_WELCOME,        // 欢迎页面
    PAGE_1,              // 页面1
    PAGE_2,              // 页面2
    PAGE_3,              // 页面3
    PAGE_SETTING,        // 设置界面
    PAGE_MAX
} PageIndex;

// 8×16字符索引
typedef enum {
    INDEX_NUM0, INDEX_NUM1, INDEX_NUM2, INDEX_NUM3, INDEX_NUM4,
    INDEX_NUM5, INDEX_NUM6, INDEX_NUM7, INDEX_NUM8, INDEX_NUM9,
    INDEX_V, INDEX_A, INDEX_m, INDEX_MAO, INDEX_DIAN, INDEX_HENG,INDEX_S
} Char8x16Index;

// 16×16汉字索引
// 字模索引枚举（增加了"设"和"置"的索引）
typedef enum {
    INDEX_HAN_BEN,    // 本
    INDEX_HAN_AN,     // 安
    INDEX_HAN_SHU,    // 输
    INDEX_HAN_CHU,    // 出
    INDEX_HAN_DIAN,   // 电
    INDEX_HAN_YA,     // 压
    INDEX_HAN_LIU,    // 流
    INDEX_HAN_FANG,   // 放
    INDEX_HAN_CHI,    // 池
    INDEX_HAN_RONG,   // 容
    INDEX_HAN_LIANG,  // 量
    INDEX_HAN_ZHOU,   // 周
    INDEX_HAN_QI,     // 期
    INDEX_HAN_BAN,    // 版
    INDEX_HAN_TONG,   // 通
    INDEX_HAN_XIN,    // 信
    INDEX_HAN_DUAN,   // 断
    INDEX_HAN_DUO,    // 多
    INDEX_HAN_LU,     // 路
    INDEX_HAN_YUAN,   // 源
    INDEX_HAN_KONG,   // 控
    INDEX_HAN_ZHI,    // 制
    INDEX_HAN_XI,     // 系
    INDEX_HAN_TONG2,  // 统
    INDEX_HAN_DI,     // 地
    INDEX_HAN_ZHI2,   // 址
    INDEX_HAN_WEI,    // 维
    INDEX_HAN_HU,     // 护
    INDEX_HAN_SHI,    // 是
    INDEX_HAN_FOU,    // 否
    INDEX_HAN_GONG,   // 供
    INDEX_HAN_ZHUANG, // 状
    INDEX_HAN_TAI,    // 态
    INDEX_HAN_JIAO,   // 交
    INDEX_HAN_SHE,    // 设 （新增）
    INDEX_HAN_ZHI3,    // 置 （新增，后缀3避免与"制"、"址"重名）
		INDEX_HAN_CHONG   // 充
} Char16x16Index;

// 全局数据结构
typedef struct {
    // 页面1数据
    uint16_t yk_modbusAddress;     // 临时Modbus地址（1-247）
    uint16_t modbusAddress;        // Modbus地址（1-247）
    float batteryVoltage;          // 电池电压(V)
    uint8_t isMaintenanceDischarge;   // 是否维护放电(0-否,1-是)
    uint8_t powerSupplyStatus;     // 供电状态(0-电池,1-交流)
    
    // 页面2数据
    uint16_t dischargeCurrent;     // 放电电流(mA)
    uint16_t batteryCapacity;      // 电池容量
    uint8_t versionMajor;          // 主版本号
    uint8_t versionMinor;          // 次版本号
    uint8_t communicationStatus;      // 通信状态(0-断开,1-连接)
    
    // 页面3数据
    int16_t cycleParam;            // 周期参数
    float safetyVoltage;           // 本安输出电压(V)
    uint16_t safetyCurrent;        // 本安输出电流(mA)
    
    // 显示控制标志
    bool dataUpdated;              // 数据更新标志
} LcdGlobalData;

// 全局数据变量
extern LcdGlobalData g_lcdData;

// 函数声明（已移除按键相关函数）
void LCD_LL_suijiClear(void);
void LCD_LL_Init(void);
void LCD_LL_Clear(void);
void LCD_LL_WriteCmd(uint8_t cmd);
void LCD_LL_WriteData(uint8_t data);
void LCD_LL_DisplayChar_8x16(uint8_t page, uint8_t col, Char8x16Index index);
void LCD_LL_DisplayChar_16x16(uint8_t page, uint8_t col, Char16x16Index index);
void LCD_LL_DisplayNumber_8x16(uint8_t page, uint8_t col, float number, uint8_t intDigits, uint8_t decDigits);
void LCD_LL_DisplayString_8x16(uint8_t page, uint8_t col, const char *str);
void LCD_LL_ShowPage(PageIndex page, LcdGlobalData *data);
// 新增：显示32×16图片（类似于16×16汉字显示方式）
void LCD_LL_DisplayPic_32x16(uint8_t page, uint8_t col, Pic32x16Index index);
void LCD_LL_DisplayPic_8x16(uint8_t page, uint8_t col, Pic8x16Index index);
#endif